auto.waitFor(); // 等待无障碍权限
//console.show()
threads.start(function () {
    //在新线程执行的代码
    while (true) {

        if (textContains("发送通知吗").findOne(1000)) {
            log("通知弹窗")
            click("拒绝")
            click("知道了")
        }
    }

}
)

// ==================== 配置参数（使用 var 声明，旧版本兼容）====================
var config = {
    packageName: "com.heytap.market", // OPPO软件商店包名
    maxRetries: 5, // 单个步骤最大重试次数
    retryInterval: 3000, // 重试间隔（毫秒）
    stepTimeout: 15000, // 常规步骤超时时间（毫秒）
    clickDelay: 3000, // 点击后等待响应时间（毫秒）
    installTimeout: 120000, // 安装超时时间（毫秒=5分钟）
    openAppDuration: 20000 // 打开应用停留时间（毫秒=25秒）
};


// ==================== 主流程（坐标点击+悬浮窗进度）====================

shell('am force-stop com.heytap.market', true);
var time = Date.now();
sleep(1000)
main()

function main() {
    try {

        // 步骤1：启动应用商店
        console.log("===== 步骤1/7：启动软件商店 =====");
        toast("===== 步骤1/7：启动软件商店 =====");
        launchMarket()


        // 步骤2：坐标点击“我的”（核心修改：替换文本识别为坐标点击）

        console.log("\n===== 步骤2/7：点击“我的” =====");
        toast("\n===== 步骤2/7：点击“我的” =====");
        clickwode()



        // 步骤3：点击“领奖励”（沿用原有文本识别点击）

        console.log("\n===== 步骤3/7：点击“领奖励” =====");
        toast("\n===== 步骤3/7：点击“领奖励” =====");
        var rewardPageSuccess = waitAndClickWithVerify("领奖励", "我的金币");
        if (!rewardPageSuccess) throw new Error("点击“领奖励”失败");


        //步骤4：体验昨日应用，打开并领取
        console.log("\n===== 步骤4/7：体验昨日应用 =====");
        toast("\n===== 步骤4/7：体验昨日应用 =====");
        sleep(2000)
        findAndClick("签到")

        if (textContains("首日体验").exists()) {
            //体验并返回领取奖励
            openAndBcak()
            //从本地获取的昨天下载app的包名列表
            var packages = readPackagesFromFile()
            //逐个卸载昨天下载的app
            for (let i = 0; i < packages.length; i++) {
                log("正在卸载: " + packages[i]);
                toast("正在卸载: " + packages[i]);
                shell('pm uninstall ' + packages[i], true);
            }
        }

        // 步骤5：安装并体验所有个应用

        console.log("\n===== 步骤5/7：安装并体验所有应用 =====");
        toast("\n===== 步骤5/7：安装并体验所有应用 =====");
        swipeDown()
        while (text("安装").findOne(config.retryInterval)) {

            installAndBcak()


        }



        //步骤6  卸载所有新安装应用
        console.log("\n===== 步骤6/7：卸载所有新安装应用 =====");
        toast("\n===== 步骤6/7：卸载所有新安装应用 =====");
        //true代表卸载所有应用，false代表记录所有包名并写入本地
        findAppsLastUpdateTime(time, "true")



        //步骤7  安装今日体验应用并且写入包名
        console.log("\n===== 步骤7/7：安装今日体验应用并且写入包名 =====");
        toast("\n===== 步骤7/7：安装今日体验应用并且写入包名 =====");
        // 重新进活动页面
        shell('am force-stop com.heytap.market', true);
        launchMarket()
        clickwode()
        rewardPageSuccess = waitAndClickWithVerify("领奖励", "我的金币");
        if (!rewardPageSuccess) throw new Error("点击“领奖励”失败");
        var installBtn = null;
        var installSuccess = false;
        var num = 0;
        time = new Date().valueOf();
        sleep(2000)

        while (text("安装").findOne(config.retryInterval)) {
            for (var retry = 0; retry < config.maxRetries; retry++) {
                try {
                    installBtn = text("安装").findOne(config.retryInterval);
                    
                    findAndClick("安装");
                    sleep(config.clickDelay);
                    installSuccess = true;
                    num = num + 1
                    break;
                } catch (e) {
                    console.log("安装按钮点击失败：" + e.message);
                    if (retry >= config.maxRetries - 1) throw new Error("安装按钮点击失败");
                }
            }
            if (!installSuccess) throw new Error("放弃寻找安装按钮");
        }
        // 子步骤2：判断近日体验是否全部安装完成
        var tomorrow = text("明日领").find()
        log(num)
        while (tomorrow.length < num) {
            sleep(3000)
            toast("已安装" + tomorrow.length)
            log("已安装" + tomorrow.length)
            tomorrow = text("明日领").find()
        }

        // 完成所有安装,包名写入本地
        findAppsLastUpdateTime(time, "false")


        log("脚本执行成功！");
        alert("脚本执行成功！");
    } catch (e) {

        console.error("\n===== 执行失败 =====", e.message);
        toast("脚本失败：" + e.message);
    } finally {


        console.log("脚本结束");
        threads.shutDownAll()
    }


}















// ==================== 辅助函数（基础命令实现）====================
/**
 * 等待目标APP激活（通过包名判断）
 * @param {string} pkg - 目标包名
 * @param {number} timeout - 超时时间（毫秒）
 * @returns {boolean} 是否成功激活
 */
function waitForPackage(pkg, timeout) {
    var endTime = Date.now() + timeout;
    while (Date.now() < endTime) {
        if (currentPackage() === pkg) return true;
        sleep(1000);
    }
    return false;
}

/**
 * 等待元素出现并点击（基础版，无复杂语法）
 * @param {string} targetText - 目标元素文本
 * @param {string} verifyText - 验证文本
 * @returns {boolean} 是否成功
 */
function waitAndClickWithVerify(targetText, verifyText) {
    var retries = 0;
    while (retries < config.maxRetries) {
        try {
            console.log("尝试点击\"" + targetText + "\"（第" + (retries + 1) + "次）");
            toast("尝试点击\"" + targetText + "\"（第" + (retries + 1) + "次）");
            var element = text(targetText).findOne(config.retryInterval);
            if (!element) throw new Error("元素未找到");
            findAndClick(targetText);
            sleep(config.clickDelay);
            if (text(verifyText).findOne(5000)) {
                console.log("\"" + targetText + "\"点击成功");
                toast("\"" + targetText + "\"点击成功");
                return true;
            }
            throw new Error("页面未切换成功");
        } catch (e) {
            retries++;
            console.log("失败原因：" + e.message + "，" + (retries < config.maxRetries ? "重试中..." : "已达最大重试次数"));
            toast("失败原因：" + e.message + "，" + (retries < config.maxRetries ? "重试中..." : "已达最大重试次数"));
            if (retries >= config.maxRetries) return false;
            sleep(config.retryInterval);
        }
    }
}

// 写入包名到本地文件
function writePackagesToFile(packages) {
    let filePath = "/sdcard/脚本/test_packages.txt";
    try {
        files.write(filePath, packages.join("\n"));
        toast("包名写入成功");
        log("写入的包名:", packages);
    } catch (e) {
        toast("写入失败: " + e);
    }
}

// 从本地文件读取包名
function readPackagesFromFile() {
    let filePath = "/sdcard/脚本/test_packages.txt";
    try {
        if (!files.exists(filePath)) {
            toast("文件不存在");
            return;
        }

        let content = files.read(filePath);
        let packages = content.split("\n").filter(function (line) {
            return line.trim();
        });

        toast("读取到 " + packages.length + " 个包名");
        log("读取的包名:", packages);
        return packages;
    } catch (e) {
        toast("读取失败: " + e);
    }
}

/**
 * 启动应用商店（通过包名判断）
 */
function launchMarket() {
    // 启动软件商店

    console.log("===== 启动软件商店 =====");
    var launchSuccess = false;
    for (var i = 0; i < config.maxRetries; i++) {

        launchPackage(config.packageName);
        if (waitForPackage(config.packageName, config.stepTimeout)) {
            launchSuccess = true;
            console.log("软件商店启动成功");
            break;
        }
        console.log("启动重试" + (i + 1) + "/" + config.maxRetries + "...");
        Home()
        sleep(config.retryInterval);
    }
    if (!launchSuccess) throw new Error("启动软件商店超时");
}

/**
 * 点击我的（通过坐标点击）
 */
function clickwode() {
    sleep(config.clickDelay); // 等待页面响应
    // 验证是否进入“我的”页面（检查“领奖励”文本）
    var count = 0
    while (!text("领奖励").exists()) {
        //点击“我的”坐标
        click(device.width * 0.8796, device.height * 0.9375);
        log(device.width * 0.8796, device.height * 0.9375)
        sleep(config.clickDelay); // 等待页面响应
        count = count + 1
        if (count > 5) {
            throw new Error("坐标点击后未找到“领奖励”，可能点击失败");
        }

    }
    console.log("坐标点击“我的”成功");
}


/**
 * 打开体验并返回
 */
function openAndBcak() {
    console.log("\n===== 检测是否有未打开应用 ,有的话打开并领取=====");
    toast("\n===== 检测是否有未打开应用 ,有的话打开并领取=====");
    var btt = text("打开").find()
    log(btt.length)
    while (btt.length > 0) {
        findAndClick("打开");
        console.log("已点击“打开”按钮");
        toast("已点击“打开”按钮");
        sleep(config.clickDelay);
        // 停留后返回商店
        console.log("应用已打开，等待" + (config.openAppDuration / 1000) + "秒...");
        toast("应用已打开，等待" + (config.openAppDuration / 1000) + "秒...");
        sleep(config.openAppDuration);
        console.log("返回软件商店...");
        toast("返回软件商店...");
        launchMarket()
        log("下滑至页面顶部")//点击打开时可能会上滑页面
        toast("下滑至页面顶部")
        swipeDown()
        //领取金币
        findAndClick("领取");
        findAndClick("领取");
        log("已领取金币")
        toast("已领取金币")
        //重新获取打开按钮数量
        if (!text("打开").findOne(2000)) {
            break
        }
    }
}


/**
 * 安装、体验应用并返回领取奖励
 */
function installAndBcak() {

    // 点击“安装”按钮
    var installBtn = null;
    var installSuccess = false;
    sleep(2000)
    for (var retry = 0; retry < config.maxRetries; retry++) {
        try {
            installBtn = text("安装").findOne(config.retryInterval);
            if (!installBtn) throw new Error("未找到安装按钮");
            findAndClick("安装");
            sleep(config.clickDelay);
            installSuccess = true;
            break;
        } catch (e) {
            console.log("安装按钮点击失败：" + e.message);
            toast("安装按钮点击失败：" + e.message);
            if (retry >= config.maxRetries - 1) throw new Error("安装按钮点击失败");
        }
    }
    if (!installSuccess) throw new Error("放弃寻找安装按钮");


    // 子步骤2：等待安装完成并点击“打开”
    console.log("等待安装完成（超时2分钟）...");
    toast("等待安装完成（超时2分钟）...");
    var openBtn = null;
    var endInstallTime = Date.now() + config.installTimeout;
    var openSuccess = false;
    while (Date.now() < endInstallTime) {

        openBtn = text("打开").find();
        if (openBtn.length > 0) {
            openAndBcak()
            openSuccess = true
            break
        } else {
            sleep(1000)
            toast("等待应用安装完成")
            log("等待应用安装完成")
        }

    }
    if (!openSuccess) {
        installAndBcak()
    }

}
/*
*上滑至页面顶部
*/
function swipeDown() {
    let x = device.width / 2;
    swipe(x, device.height * 0.3, x, device.height * 0.7, 500);
    swipe(x, device.height * 0.3, x, device.height * 0.7, 500);
    swipe(x, device.height * 0.3, x, device.height * 0.7, 500);
}





// ==================== 点击文字函数====================
/**
 * 根据文字查找并点击控件
 * @param {string} targetText 要查找的文字
 * @param {number} maxScroll 最大滑动次数，默认3次
 * @return {boolean} 是否点击成功
 */
function findAndClick(targetText, maxScroll) {
    maxScroll = maxScroll || 5;

    for (let i = 0; i < maxScroll; i++) {
        // 查找包含目标文字的控件
        let controls = text(targetText).find();

        if (controls.length > 0) {
            let control = controls[0];
            let bounds = control.bounds();
            let x = bounds.centerX();
            let y = bounds.centerY();

            // 检查坐标是否在屏幕内
            if (x > 0 && x < device.width && y > 0 && y < device.height) {
                // 尝试点击
                if (control.clickable()) {
                    return control.click();
                } else {
                    log(x, y)
                    return click(x, y);
                }
            }
        }

        // 向上滑动
        swipe(device.width / 2, device.height * 0.7,
            device.width / 2, device.height * 0.3, 500);
        sleep(1000);
    }

    return false;
}


// ==================== 查询app安装时间====================
function findAppsLastUpdateTime(time, param) {
    //sleep(30000);

    var pm = context.getPackageManager()
    var appList = pm.getInstalledApplications(0)
    var packages = [];

    for (let i = 0; i < appList.size(); i++) {
        var app_ = appList.get(i)
        var appInfo = {
            appName: app_.loadLabel(pm),
            packageName: app_.packageName,

            lastUpdateTime: pm.getPackageInfo(app_.packageName, 0).lastUpdateTime
        }
        if (appInfo.lastUpdateTime > time && param == "true") {
            console.log("卸载" +appInfo.appName);
            toast("卸载" + appInfo.appName)
            shell('pm uninstall ' + appInfo.packageName, true);
            sleep(2000)

        } 
        if (appInfo.lastUpdateTime > time && param == "false") {
            console.log("写入包名" +appInfo.appName);
            toast("写入包名" + appInfo.appName)
            packages.push(appInfo.packageName)

        }

    }
    writePackagesToFile(packages)
}



// ==================== 对app进行不同操作====================
function 操作app(操作, app名称) {
    var 包名 = getPackageName(app名称);
    log(包名)
    switch (操作) {
        case "启动":
            shell('am start ' + 包名, true);
            sleep(10000)
            break;
        case "清除":
            操作app("停止", "设置")
            log("停止设置完成")
            openAppSetting(包名);
            点击文字("存储");
            点击文字("删除数据");
            点击文字("确定");
            sleep(10000)
            break;
        case "卸载":
            shell('pm uninstall ' + 包名, true);
            sleep(10000)
            break;
        case "停止":
            shell('am force-stop ' + 包名, true);
            sleep(10000)
            break;
        default:
            log("默认")
    }
}
/**
 * 遍历所有应用，查找在指定时间戳之后打开的应用包名
 * @param {number} targetTimestamp 目标时间戳（毫秒），需大于此时间戳的应用才会被筛选
 * @returns {string} 符合条件的应用包名（为空则无匹配）
 */
function findAppsOpenedAfterTimestamp(targetTimestamp) {
    try {
        // 通过全局context获取UsageStatsManager（无需activity）
        var usageStatsManager = context.getSystemService(context.USAGE_STATS_SERVICE);
        var endTime = new Date().getTime(); // 当前时间戳（毫秒）
        var startTime = endTime - 60 * 60 * 1000; // 查询最近30天的记录（可调整范围）

        // 获取时间范围内所有应用的使用统计数据
        var usageStatsList = usageStatsManager.queryUsageStats(
            usageStatsManager.INTERVAL_BEST, // 自动适配时间间隔（推荐）
            startTime,
            endTime
        );

        // 若无使用记录，返回空
        if (!usageStatsList || usageStatsList.size() === 0) {
            return null;
        }

        // 遍历所有应用使用记录，筛选符合条件的包名

        for (var i = 0; i < usageStatsList.size(); i++) {
            var stats = usageStatsList.get(i);
            var lastOpenTime = stats.getLastTimeUsed(); // 应用上次打开时间戳（毫秒）

            // 若上次打开时间 > 目标时间戳，则加入结果列表
            if (lastOpenTime > targetTimestamp && (stats.getPackageName() != "org.autojs.autojs")) {
                if (stats.getPackageName() != "com.heytap.market") {
                    return stats.getPackageName();
                }
            }
        }

        return null; // 返回所有符合条件的包名
    } catch (e) {
        console.error("筛选失败：" + e.message);
        return null;
    }
}
